package demo1;

public class Test {

    public static void main(String[] args) {

//        Animal animal1 = new Dog("小七", 7,"黑色");
//        Animal animal2 = new Cat("小花", 3, "金色");
        //当父类和子类有相同的方法的时候，并且函数名相同，参数相同，参数列表相同
        //此时就构成 --- 多态
//        animal1.eat();
//        animal2.eat();
        //多态 vs 重载
        //重载要求 --- 返回值不要求，函数名相同，参数列表不同！！！
        //多态要求 --- 返回值相同，函数名相同，参数列表相同！！！

//*************************************************************


//        Animal animal = new Cat("翠花", 12, "灰色");//向上转型
//        animal.eat();//猫属于动物，所以父类引用，引用的是子类的对象
        //当子类和父类构成多态，那么就调用子类的方法，如果调用的方法中，子类没有，而父类有，那就调用父类的，都没有那么久报错
        //animal.bark();//父类的引用，只能调用父类有的方法


//**************************************************************


        //三种向上转型的方法
        //1 ---- 直接赋值
//        Animal animal = new Dog("黑狗", 19, "白色");
//        animal.eat();


        //2 --- 参数传递
//        Dog dog = new Dog("大黑狗", 12,"咖啡色");
//        func(dog);

        //3 --- 返回值传递
//        Animal animal = func1(1);
//        animal.eat();


//*********************************************************
        //当存在父子关系时，返回值不同也可以构成重写 --- 协变类型
//        Animal animal = new Dog("小灰灰", 111, "黄色");
//        animal.sleep();

//*********************************************************
        //子类的权限要大于等于父类的权限才可以构成重写
//        Animal animal = new Dog("大黄狗", 11, "红色");
//        animal.play();

    }


    public static void func(Animal animal) {
        animal.eat();
    }

    public static Animal func1(int x) {
        if(x == 1) {
            return new Dog("小白", 13, "黑色");
        } else if(x == 2) {
            return new Cat("花花", 15, "奶白色");
        }
        return null;
    }

}
